#include "LogWidget.h"
#include "ui_LogWidget.h"
#include "LogFileHandler.h"

/**
 * @brief 构造函数，初始化UI组件和文件处理器
 * @param parent 父窗口指针（用于窗口层级管理）
 */
LogWidget::LogWidget(QWidget *pParent) : QWidget(pParent), m_pUi(new Ui::LogWidget), m_pFileHandler(new LogFileHandler(this)) {
    m_pUi->setupUi(this); // 初始化UI界面

    // 连接文件处理器的清理完成信号到界面更新槽
    connect(m_pFileHandler, &LogFileHandler::logCleaned, this, [this]() {
        QListWidgetItem *item = new QListWidgetItem("清理过期日志完成");
        m_pUi->logListWidget->addItem(item);
        m_pUi->logListWidget->scrollToBottom();
    });
    
    // 连接QListWidget的选择变化信号，处理日志项的选中状态
    connect(m_pUi->logListWidget, &QListWidget::currentItemChanged, this, [this](QListWidgetItem *current, QListWidgetItem *previous) {
        if(current)
        {
            qobject_cast<LogDisplayModule*>(m_pUi->logListWidget->itemWidget(current))->setSelected(true);
        }
        if(previous)
        {
            qobject_cast<LogDisplayModule*>(m_pUi->logListWidget->itemWidget(previous))->setSelected(false);
        }
    });
}

/**
 * @brief 析构函数，释放UI和文件处理器资源
 */
LogWidget::~LogWidget() {
    delete m_pUi;       // 释放UI界面资源
    delete m_pFileHandler; // 释放文件处理器资源
}

/**
 * @brief 向界面添加日志并可选地写入文件
 * @param sender 日志发送者插件名称（如"CameraPlugin"）
 * @param message 日志具体内容（如"相机连接成功"）
 * @param logType 日志级别（如LOG_INFO、LOG_WARNING、LOG_ERROR）
 * @param writeToFile 是否写入日志文件（默认为true）
 */
void LogWidget::appendLog(const QString& sender, const QString& message, LogType logType, bool writeToFile) {
    // 获取当前时间
    QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    
    // 构造完整的日志消息，包含发送者信息
    QString fullMessage = QString("%1: %2").arg(sender, message);

    // 创建LogDisplayModule实例
    LogDisplayModule *logModule = new LogDisplayModule(m_pUi->logListWidget);
    logModule->setLogContent(logType, time, fullMessage, false);
    
    // 创建列表项并设置widget
    QListWidgetItem *item = new QListWidgetItem(m_pUi->logListWidget);
    item->setSizeHint(logModule->sizeHint());
    m_pUi->logListWidget->addItem(item);
    m_pUi->logListWidget->setItemWidget(item, logModule);
    
    // 自动滚动到最新条目
    m_pUi->logListWidget->scrollToBottom();
    
    // 构造带时间戳和日志级别的日志行用于文件记录
    QString levelStr;
    switch(logType) {
    case LogType::LOG_INFO:
        levelStr = "INFO";
        break;
    case LogType::LOG_WARNING:
        levelStr = "WARNING";
        break;
    case LogType::LOG_ERROR:
        levelStr = "ERROR";
        break;
    default:
        levelStr = "INFO";
        break;
    }
    
    QString logLine = QString("[%1] %2 [%3]: %4").arg(time, sender, levelStr, message);
    
    // 如果需要写入文件，则调用文件处理器写入日志文件
    if (writeToFile) {
        m_pFileHandler->writeLog(logLine);
    }
}

/**
 * @brief 设置日志文件存储目录（转发至文件处理器）
 * @param dir 目标目录绝对路径（如"D:/CameraLogs/"）
 */
void LogWidget::setLogDir(const QString& dir)
{
    m_pFileHandler->setLogDir(dir); // 转发目录设置到文件处理器
}
